若是是太多分支,會造成leaf太多,而每一個leaf都只是用其中一筆資料建立出來的,因此對model來說,會過度擬和(overfitting)
因此在驗證(validation)的時候,需要測試較多的情況,並且用不同的參數來驗證
得到最好的值之後,再利用這個參數,對所有資料建模
# 讀取資料
import pandas as pd
melbourne_file_path = './Dataset/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path)
# 處理缺失值
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# 選擇目標和特徵
y = filtered_melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea',
'YearBuilt', 'Lattitude', 'Longtitude']
X = filtered_melbourne_data[melbourne_features]
# 切割資料成訓練資料和驗證資料
from sklearn.model_selection import train_test_split
train_X, val_X, train_y, val_y = train_test_split(X, y,random_state = 0)
# 匯入決策樹和平均絕對誤差
from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressor
# 寫一個叫做取得平均絕對誤差的function,get_mae
# input有樹的最大節點數量(max_leaf_nodes)、訓練資料和驗證資料
def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
# 創建一個決策樹的model,並且將最大節點數量設為max_leaf_nodes
model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
# 訓練資料
model.fit(train_X, train_y)
# 取得預測結果
preds_val = model.predict(val_X)
# 算出平均絕對誤差
mae = mean_absolute_error(val_y, preds_val)
return(mae)
# 求出不同的最大節點的平均絕對誤差
for max_leaf_nodes in [5, 50, 500, 5000]:
my_mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y)
print("Max leaf nodes: %d \t\t Mean Absolute Error: %d" %(max_leaf_nodes, my_mae))
Max leaf nodes: 5 Mean Absolute Error: 347380
Max leaf nodes: 50 Mean Absolute Error: 258171
Max leaf nodes: 500 Mean Absolute Error: 243495
Max leaf nodes: 5000 Mean Absolute Error: 254983
在這邊發現max_leaf_node=500對這個模型來說是相對好的參數
因此使用這個參數對全部的資料做建模
Overfitting: 太過吻合訓練資料,導致在驗證的時候準確度降低
Underfitting: 不夠吻合訓練資料,導致預測的時候不準確